package com.good.shopping.search.thread;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * 异步编排 - CompletetableFuture
 *     线程串行化 ：
 *          当前一个线程执行完，再执行下一个线程
 *                 .thenRunAsync()    无参数，无返回值
 *                 .thenAcceptAsync() 有参数，无返回值
 *                 .thenApplyAsync()  有参数，有返回值
 * @author shengren.yan
 * @create 2022-03-01
 */
public class ThreadTest3 {

    //初始化线程池
    public static ExecutorService executor = Executors.newFixedThreadPool(10);

    public static void main(String[] args) throws Exception {

        System.out.println("main......start.....");
        // 测试1 ：A线程执行完，B线程才能执行  thenRunAsync
//        CompletableFuture.supplyAsync(() -> {
//            try {
//                Thread.sleep(3000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            System.out.println("任务1启动了。。。。" + Thread.currentThread().getId());
//            int i = 10 / 2;
//            return i;
//        }, executor).thenRunAsync(()->{
//            System.out.println("任务2启动了。。。。" + Thread.currentThread().getId());
//        },executor);
//        System.out.println("主线程得到：返回结果：" );
//        System.out.println("main......end.....");

        // 测试2 ：A线程执行完，B线程才能执行  thenAcceptAsync 可获取参数
//        CompletableFuture.supplyAsync(() -> {
//            try {
//                Thread.sleep(3000);
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//            System.out.println("任务1启动了。。。。" + Thread.currentThread().getId());
//            int i = 10 / 2;
//            return i;
//        }, executor).thenAcceptAsync((res)->{
//            // 执行下一个线程，可以获取上一个线程的参数 res
//            System.out.println("任务2启动了。。。。参数：" + res + " 线程: "+ Thread.currentThread().getId());
//        },executor);
//        System.out.println("主线程得到：结果："  );
//        System.out.println("main......end.....");

        // 测试3 ：A线程执行完，B线程才能执行  thenApplyAsync 可获取参数 返回值
        CompletableFuture<Integer> future5 = CompletableFuture.supplyAsync(() -> {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("任务1启动了。。。。" + Thread.currentThread().getId());
            int i = 10 / 2;
            return i;
        }, executor).thenApplyAsync((res) -> {
            // 执行下一个线程，可以获取上一个线程的参数 res
            System.out.println("任务2启动了。。。。参数：" + res + " 线程: " + Thread.currentThread().getId());
            // 可可以修改返回参数
            return res * 2;
        }, executor);
        System.out.println("主线程得到：结果："  + future5.get());
        System.out.println("main......end.....");

    }

}
